package org.jeecg.modules.oms.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.modules.oms.entity.SemiProductSalesOrder;
import org.jeecg.modules.oms.entity.SemiProductSalesOrderTransaction;

import java.math.BigDecimal;
import java.util.List;

/**
 * 半成品销售订单Service接口
 */
public interface ISemiProductSalesOrderService extends IService<SemiProductSalesOrder> {

    /**
     * 分页查询半成品销售订单
     * @param page 分页参数
     * @param order 查询条件
     * @return 分页结果
     */
    IPage<SemiProductSalesOrder> queryOrderPage(Page<SemiProductSalesOrder> page, SemiProductSalesOrder order);

    /**
     * 根据订单号查询订单（同一租户下唯一）
     * @param orderNo 订单号
     * @param tenantId 租户ID
     * @return 订单信息
     */
    SemiProductSalesOrder getByOrderNo(String orderNo, Integer tenantId);

    /**
     * 根据客户ID查询订单列表
     * @param customerId 客户ID
     * @return 订单列表
     */
    List<SemiProductSalesOrder> getByCustomerId(String customerId);

    /**
     * 根据项目ID查询订单列表
     * @param projectId 项目ID
     * @return 订单列表
     */
    List<SemiProductSalesOrder> getByProjectId(String projectId);

    /**
     * 根据状态查询订单列表
     * @param status 订单状态
     * @return 订单列表
     */
    List<SemiProductSalesOrder> getByStatus(Integer status);

    /**
     * 添加半成品销售订单
     * @param order 订单信息
     * @return 添加结果
     */
    boolean addSemiProductSalesOrder(SemiProductSalesOrder order);

    /**
     * 添加半成品销售订单（包含交易记录）
     * @param order 订单信息
     * @param transactionList 交易记录列表
     * @return 添加结果
     */
    boolean addSemiProductSalesOrderWithTransactions(SemiProductSalesOrder order, List<SemiProductSalesOrderTransaction> transactionList);

    /**
     * 更新半成品销售订单
     * @param order 订单信息
     * @return 更新结果
     */
    boolean updateSemiProductSalesOrder(SemiProductSalesOrder order);

    /**
     * 更新半成品销售订单（包含交易记录）
     * @param order 订单信息
     * @param transactionList 交易记录列表
     * @return 更新结果
     */
    boolean updateSemiProductSalesOrderWithTransactions(SemiProductSalesOrder order, List<SemiProductSalesOrderTransaction> transactionList);

    /**
     * 删除半成品销售订单
     * @param id 订单ID
     * @return 删除结果
     */
    boolean deleteSemiProductSalesOrder(String id);

    /**
     * 审核订单
     * @param id 订单ID
     * @param status 审核状态
     * @param auditBy 审核人
     * @param auditRemark 审核备注
     * @return 审核结果
     */
    boolean auditOrder(String id, Integer status, String auditBy, String auditRemark);

    /**
     * 更新订单状态
     * @param id 订单ID
     * @param status 新状态
     * @param updateBy 更新人
     * @return 更新结果
     */
    boolean updateOrderStatus(String id, Integer status, String updateBy);

    /**
     * 更新订单金额信息
     * @param id 订单ID
     * @param totalAmount 总金额
     * @param paidAmount 已付金额
     * @param unpaidAmount 未付金额
     * @param payStatus 付款状态
     * @param updateBy 更新人
     * @return 更新结果
     */
    boolean updateOrderAmount(String id, BigDecimal totalAmount, BigDecimal paidAmount, 
                             BigDecimal unpaidAmount, Integer payStatus, String updateBy);

    /**
     * 生成订单编号
     * @param tenantId 租户ID
     * @return 订单编号
     */
    String generateOrderNo(Integer tenantId);

    /**
     * 检查订单号是否存在
     * @param orderNo 订单号
     * @param tenantId 租户ID
     * @param excludeId 排除的订单ID
     * @return 是否存在
     */
    boolean checkOrderNoExists(String orderNo, Integer tenantId, String excludeId);

    /**
     * 统计订单数量
     * @param order 查询条件
     * @return 订单数量
     */
    Integer countOrders(SemiProductSalesOrder order);

    /**
     * 计算订单利润
     * @param id 订单ID
     * @return 利润金额
     */
    BigDecimal calculateOrderProfit(String id);
}
